<?php

/**
 * ws actions.
 *
 * @package    sbweb-ws
 * @subpackage ws
 * @author     Pablo Andrés Díaz <pabloandi@gmail.com>
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class wsActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $this->forward('default', 'module');
  }

  /**
   * Servicio Usuarios
   */

  /**
   * Verificar la existencia de un usuario
   * @WSMethod(name='ValidaUsuario', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @param string $NiP ??
   * @return int resultado
   */
  public function executeValidaUsuario(sfRequest $request){
      $this->result= $this->validaUsuario($request->getParameter('NoCta'),$request->getParameter('NiP'));
  }

  private function validaUsuario($noCuenta,$nip){
      $usuario=Doctrine_Core::getTable('Usuarios')->find($noCuenta);
      if($usuario){
          if($usuario->getNip()==$nip)
              return 1;
          else
              return 3;

      }
      else
          return 2;
  }

  /**
   * Verificar si el usuario cuenta con adeudos pendientes
   * @WSMethod(name='VAdeudo', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @return int resultado
   */

  public function executeVAdeudo(sfRequest $request){

  }

  /**
   * Muestra al usuario la totalidad de multas pendientes por saldar
   * @WSMethod(name='VMulta', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @return string[] resultado
   */

  public function executeVMulta(sfRequest $request){
    $this->result=$this->vMulta($request);
  }

  private function vMulta(sfRequest $request){
      Doctrine_Core::getTable('Bloqueos')->createQuery('m')->where('m.no_cuenta = ?',$request->getParameter('NoCta'))->fetchArray();
  }

  /**
   * Muestra los libros pendientes por entregar
   * @WSMethod(name='PPendientes', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @return string[] resultado
   */

  public function executePPendientes(sfRequest $request){
    $this->result= $this->pPendientes($request);
  }

  private function pPendientes(sfRequest $request){
      return Doctrine_Core::getTable('Prestamos')
    ->createQuery('p')
    ->select('p.no_adqui AS NumAdqui, p.titulo AS Titulo, p.clasificacion AS Clasificacion, p.f_prestamo AS FPrestamo, p.f_entrega AS FEntrega, p.renovaciones AS Renovaciones, p.tipo_prestamo AS TipoPrestamo')
    ->where('p.no_cuenta = ?',$request->getParameter('NoCta'))
    ->fetchArray();
  }

  /**
   * Mostrar todos los prestamos de un usuario que ha hecho en una rango de fechas
   * @WSMethod(name='PHistoricos', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @param string $FInicio Fecha de inicio
   * @param string $FFin Fecha fin
   * @return array resultado
   */
  public function executePHistoricos(sfRequest $request){
      $devoluciones = Doctrine_Core::getTable('Devoluciones')
      ->createQuery('d')
      ->select('d.no_adqui AS NumAdqui, d.titulo AS Titulo, d.clasificacion AS Clasificacion, d.f_prestamo AS FPrestamo, d.f_devolucion AS FDevolucion, d.tipo_prestamo AS TipoPrestamo, d.renovaciones AS Renovaciones, d.tipo_material AS TipoMaterial')
      ->where('d.no_cuenta = ?',$request->getParameter('NoCta'))
      ->andWhere('d.f_prestamo <= ?',$request->getParameter('FInicio'))
      ->andWhere('d.f_prestamo >= ?',$request->getParameter('FFin'))
      ->fetchArray();

      $this->result= $devoluciones;
  }

  /**
   * Muestra las escuelas que corresponden a una biblioteca
   * @WSMethod(name='ListarEscuelas', webservice='Siabuc9')
   *
   * @param int $IdBiblio Número de cuenta
   * @return array resultado
   */

  public function executeListarEscuelas(sfRequest $request){
    $escuelas = Doctrine_Core::getTable('Escuelas')
        ->createQuery('e')
        ->select('e.idescuela AS IdEscuela, e.nombre AS Nombre')
        ->where('e.idbiblioteca = ?', $request->getParameter('IdBiblio'))
        ->fetchArray();

    $this->result= $escuelas;
    
  }

  /**
   * Crear usuarios
   * @WSMethod(name='RegUsuario', webservice='Siabuc9')
   *
   * @param string $NumCuenta Numero de cuenta
   * @param string $Nombre Nombre
   * @param int $Escuela Escuela
   * @param string $Correo Correo
   * @param string $Domicilio Domicilio
   * @param string $Colonia Colonia
   * @param string $Ciudad Ciudad
   * @param string $CodPos Código postal
   * @param string $Telefono Teléfono
   * @param int $NumGrupo Número de grupo
   * @param string $VigenciaIni Vigencia inicial
   * @param string $VigenciaFin Vigencia final
   * @return string retorna 'guardado' y 'no_guardado'
   */
  public function executeRegUsuario(sfRequest $request){
    $usuario = new Usuarios();
    $usuario->setNoCuenta($request->getParameter('NumCuenta'));
    $usuario->setNombre($request->getParameter('Nombre'));
    $usuario->setIdEscuela($request->getParameter('Escuela'));
    $usuario->setCorreo($request->getParameter('Correo'));
    $usuario->setDomicilio($request->getParameter('Domicilio'));
    $usuario->setColonia($request->getParameter('Colonia'));
    $usuario->setCiudadEstado($request->getParameter('Ciudad'));
    $usuario->setCodPos($request->getParameter('CodPos'));
    $usuario->setTelefono($request->getParameter('Telefono'));
    $usuario->setNumGrupo($request->getParameter('NumGrupo'));
    $usuario->setInicioVigencia($request->getParameter('VigenciaIni'));
    $usuario->setFinVigencia($request->getParameter('VigenciaFin'));

    if($usuario->save())
            $this->result= 'guardado';
    else
        $this->result= 'no_guardado';

  }

  /**
   * Mostrar todos los prestamos de un usuario que ha hecho en una rango de fechas
   * @WSMethod(name='Renovar', webservice='Siabuc9')
   *
   * @param string $NoCta Numero de cuenta
   * @param string $Nip Contraseña
   * @param string $NoAdq Número adquisición
   * @param bool $RenovarUnaVez Renovar una vez
   * @return string exito, error
   */
  public function executeRenovar(sfRequest $request){

      if($this->validaUsuario($request->getParameter('NoCta'),$request->getParameter('NiP')) == 1){
        $prestamo = Doctrine_Core::getTable('Prestamos')
          ->createQuery('p')
          ->where('p.no_cuenta = ?',$request->getParameter('NoCta'))
          ->andWhere('p.no_adqui = ?',$request->getParameter('NoAdq'))
          ->execute();

        if($prestamo){
            $restriccion=$this->politicaPrestamo($request);
            $renovacion = Doctrine_Core::getTable('Renovaciones')
            ->createQuery('r')
            ->where('r.idprestamo = ?',$prestamo->getPrimaryKey())
            ->execute();
            
            // pendiente: inconsistencias en grupos 
            
            $this->result= 'exito';
        }
        else
            $this->result= 'error';
      }
      else
          $this->result= 'error';


  }
  
  /**
   * Politica de prestamo (función auxiliar de renovar)
   */
  private function politicaPrestamo(sfRequest $request){
      $numadqui=$request->getParameter('NoAdq');
      $q = Doctrine_Core::getTable('CtrlRestricciones')
		->createQuery('cr')
		->where('cr.no_adqui = ?', $numadqui)
		->execute();
		
	$restriccion=Doctrine_Core::getTable('Restricciones')
		->createQuery('r')
		->find($q->getIdRestriccion);
		
		if($restriccion){
			return $restriccion;
		}
		else
		{
			//pendiente porque no es claro lo de grupos
		}
		
		
		$escuelas = Doctrine_Core::getTable('Escuelas')
        ->createQuery('e')
        ->select('e.idescuela AS IdEscuela, e.nombre AS Nombre')
        ->where('e.idbiblioteca = ?', $request->getParameter('IdBiblio'))
        ->fetchArray();

  }
  

  /**
   * Servicio retroalimentación
   */

  /**
   * Reporte de inconformidades por parte del usuario
   * @WSMethod(name='RpteQueja', webservice='Siabuc9')
   *
   * @param string $NoCta Número de cuenta
   * @param string $Nombre Nombre
   * @param int $IdEscuela Escuela a la que pertenece el usuario
   * @param string $LaQueja Descripción de la incorformidad
   * @return string exito, error
   */
  public function executeRpteQueja(sfRequest $request){
    $queja = new Quejas();
    $queja->setNoCuenta($request->getParameter('NoCta'));
    $queja->setNombre($request->getParameter('Nombre'));
    $queja->setIdescuela($request->getParameter('IdEscuela'));
    $queja->setQueja($request->getParameter('LaQueja'));

    if($queja->save())
        $this->result= 'exito';
    else
        $this->result= 'error';


  }

  /**
   * Listado de inconformidades que aun no han sido respondidas
   * @WSMethod(name='ListarQuejas', webservice='Siabuc9')
   *
   * @return array[] array de quejas: IdQueja, NoCta, Nombre, FQueja, LaQueja
   */
  public function executeListarQuejas(sfRequest $request){
    $quejas = Doctrine_Core::getTable('Quejas')
      ->createQuery('q')
      ->select('q.idqueja AS IdQueja, q.no_cuenta AS NoCta, q.nombre AS Nombre, q.fqueja AS FQueja, q.queja AS LaQueja')
      ->andWhere('q.respuesta IS NULL')
      ->fetchArray();

    $this->result= $quejas;

    //var_dump($quejas);
    //return sfView::NONE;
  }

  /**
   * Dar respuesta a las quejas
   * @WSMethod(name='RptaQueja', webservice='Siabuc9')
   *
   * @param int $IdQueja Número de cuenta
   * @param string $Respuesta Respuesta
   * @param bool $Aplica Informa si la queja es viable de realizar o no.
   * @return string exito, error
   */
  public function executeRptaQueja(sfRequest $request){
    $queja=Doctrine_Core::getTable('Quejas')->createQuery('q')->find($request->getParameter('IdQueja'));
    $queja->setRespuesta($request->getParameter('Respuesta'));
    $queja->setAplica($request->getParameter('Aplica'));
    $queja->setFrespuesta(date("Y:m:d"));

    if($queja->save())
            $this->result= 'exito';
    else
        $this->result= 'error';


  }

  /**
   * Registrar los comentarios acerca de los títulos consultados/leídos
   * @WSMethod(name='RecTitulos', webservice='Siabuc9')
   *
   * @param string $NoCta Número de cuenta
   * @param string $Usuario Usuario
   * @param int $IdEscuela Escuela a la que pertenece el usuario
   * @param string $NumAdqui Número de adquisición
   * @param string $ElTitulo Título del libro
   * @param string $ElAutor Autor del libro
   * @param string $LaClasificacion Clasificación del libro
   * @param string $LaRecomendacion Recomendación del libro
   * @param int $Calificacion Calificación al libro
   * @return string exito, error
   */
  public function executeRecTitulos(sfRequest $request){
    $recomendacion=new Recomendaciones();
    $recomendacion->setNoCuenta($request->getParameter('NoCta'));
    $recomendacion->setUsuario($request->getParameter('Usuario'));
    $recomendacion->setIdescuela($request->getParameter('IdEscuela'));
    $recomendacion->setNoAdqui($request->getParameter('NumAdqui'));
    $recomendacion->setTitulo($request->getParameter('ElTitulo'));
    $recomendacion->setAutor($request->getParameter('ElAutor'));
    $recomendacion->setClasificacion($request->getParameter('LaClasificacion'));
    $recomendacion->setRecomendacion($request->getParameter('LaRecomendacion'));
    $recomendacion->setCalificacion($request->getParameter('Calificacion'));
    $recomendacion->setFrecomendacion(date("Y:m:d"));

    if($recomendacion->save())
            $this->result= 'exito';
    else
        $this->result= 'error';
  }

  /**
   * Recomendar títulos para su posible compra
   * @WSMethod(name='SugCompra', webservice='Siabuc9')
   *
   * @param string $NoCta Número de cuenta
   * @param string $Usuario Usuario
   * @param int $IdEscuela Escuela a la que pertenece el usuario
   * @param string $Titulo Título del libro
   * @param string $ElAutor Autor del libro
   * @param string $LaEditorial Editorial del libro
   * @param string $ElISBN ISBN del libro
   * @param string $LaSugerencia Sugerencias
   * @return string exito, error
   */
  public function executeSugCompra(sfRequest $request){
    $sugcompra = new Sugerenciascompra();
    $sugcompra->setNoCuenta($request->getParameter('NoCta'));
    $sugcompra->setUsuario($request->getParameter('Usuario'));
    $sugcompra->setIdescuela($request->getParameter('IdEscuela'));
    $sugcompra->setTitulo($request->getParameter('Titulo'));
    $sugcompra->setAutor($request->getParameter('Autor'));
    $sugcompra->setEditorial($request->getParameter('LaEditorial'));
    $sugcompra->setIsbn($request->getParameter('ElISBN'));
    $sugcompra->setSugerencia($request->getParameter('LaSugerencia'));
    $sugcompra->setFsugerencia(date("Y:m:d"));

    if($sugcompra->save())
            $this->result= 'exito';
    else
        $this->result= 'error';

  }

  /**
   * Nuevas operaciones de SIB
   */

  /**
   * Mostrar el nombre de la escuela
   * @WSMethod(name='MuestraEscuela', webservice='Siabuc9')
   *
   * @param string $IdEscuela Identificación de la escuela
   * @return string[] Escuela
   */
  public function executeMuestraEscuela(sfRequest $request){
    $this->result= Doctrine_Core::getTable('Escuelas')->createQuery('e')->find($request->getParameter('IdEscuela'))->fetchArray();
  }

  /**
   * Mostrar el nombre del grupo
   * @WSMethod(name='MuestraGrupo', webservice='Siabuc9')
   *
   * @param string $IdGrupo Identificación de la escuela
   * @return string[] Grupo
   */
  public function executeMuestraGrupo(sfRequest $request){
    $grupo = Doctrine_Core::getTable('Grupos')->createQuery('g')->find($request->getParameter('IdGrupo'))->fetchArray();
    $this->result= $grupo;
  }

  /**
   * Mostrar el nombre de carreras
   * @WSMethod(name='MuestraCarrera', webservice='Siabuc9')
   *
   * @param string $IdCarrera Identificación de la escuela
   * @return string[] Carrera
   */
  public function executeMuestraCarrera(sfRequest $request){
    $carrera = Doctrine_Core::getTable('Carreras')->createQuery('c')->find($request->getParameter('IdCarrera'))->fetchArray();
    return $carrera;
  }
  
  /**
   * Mostrar los detalles de usuario
   * @WSMethod(name='DetallesUsuarios', webservice='Siabuc9')
   *
   * @param string $IdUsuario Identificación del usuario
   * @return string[] array con nombre,escuela,programa y grupos del usuario
   */
  public function executeDetallesUsuarios(sfRequest $request){
    $usuario=Doctrine_Core::getTable('Usuarios')->createQuery('u')->find($request->getParameter('IdUsuario'));
    $res=array();
    $res['Nombre']=$usuario->getNombre();
    $res['Escuela']=$usuario->getEscuela()->getNombre();
    $res['Carrera']=$usuario->getCarrera()->getNombre();
    $res['Grupo']=$usuario->getNoGrupo()->getDescripcion();

    return $res;
  }
  
  /**
   * Mostrar los detalles de bloqueo de un usuario, si lo está bloqueado
   * @WSMethod(name='UBloqueos', webservice='Siabuc9')
   *
   * @param string $IdUsuario Identificación del usuario
   * @return string[] array con datos del bloqueo
   */
  public function executeUBloqueos(sfRequest $request){
    $this->result=$this->uBloqueos($request);
  }

  private function uBloqueos(sfRequest $request){
    $bloqueos=Doctrine_Core::getTable('Bloqueos')->createQuery('b')->find($request->getParameter('IdUsuario'))->fetchArray();
    return $bloqueos;
  }

    
  /**
   * Mostrar si el usuario está o no a paz y salvo de la biblioteca
   * @WSMethod(name='PazySalvo', webservice='Siabuc9')
   *
   * @param string $IdUsuario Identificación del usuario
   * @return bool Usuario si está a paz y salvo o no
   */
  public function executePazySalvo(sfRequest $request){
    if(count($this->vMulta($request))>0)
            $this->result= false;
    elseif(count($this->pPendientes($request))>0)
            $this->result=false;
    elseif(count($this->uBloqueos($request))>0)
            $this->result=false;
    else
        $this->result=true;
  }
  
  /**
   * 
   * @WSMethod(name='Reservar', webservice='Siabuc9')
   *
   * @param string $NoCta Identificación del usuario
   * @param string $NumAdq Número de adquisición del libro
   * @param string $IdBiblio Id de biblioteca
   * @param string $Usuario Usuario
   * @param string $Titulo Título del libro
   * @param string $Autor Autor del libro
   * @param string $Clasificacion Clasificación del libro
   * @param string $Observaciones Clasificación del libro
   * @return string exito o error 
   */
  public function executeReservar(sfRequest $request){
    $reserva=new Reserva();
    $reserva->setIdbiblioteca($request->getParameter('IdBiblio'));
    $reserva->setNoCuenta($request->getParameter('NoCta'));
    $reserva->setNoAdqui($request->getParameter('NumAdq'));
    $reserva->setUsuario($request->getParameter('Usuario'));
    $reserva->setTitulo($request->getParameter('Titulo'));
    $reserva->setAutor($request->getParameter('Autor'));
    $reserva->setClasificacion($request->getParameter('Clasificacion'));
    $reserva->setObservaciones($request->getParameter('Observaciones'));
    
    if($reserva->save())
		$this->result='exito';
	else
		$this->result='error';
  }
  
  /**
   * 
   * @WSMethod(name='Reservar', webservice='Siabuc9')
   *
   * @param string $NumAdq Número de adquisición del libro
   * @return int exito o error 
   */
  public function executePoliticaBloqueo(sfRequest $request){
    $especial = Doctrine_Core::getTable('MatEspecial')
    ->createQuery('me')
    ->findOneByNoAdq($request->getParameter('NumAdq'));
    
    
    if($especial)
		$this->result=1;
	else
		$this->result=0;
  }
  
  /**
   * 
   * @WSMethod(name='DetalleLibBloqueo', webservice='Siabuc9')
   *
   * @param string $IdEst Id del estado
   * @return array Tupla de id y descripcion
   */
  public function executeDetalleLibBloqueo(sfRequest $request){
    $especial = Doctrine_Core::getTable('MatEspecial')
    ->createQuery('me')
    ->findOneByNoAdq($request->getParameter('NumAdq'));
    
    
    if($especial)
		$this->result=1;
	else
		$this->result=0;
  }
  
  
  

  /**
   * Testea el webservice
   * @WSMethod(name='Prueba', webservice='Siabuc9')
   *
   * @return bool Usuario si está a paz y salvo o no
   */
  public function executePrueba(sfRequest $request){
   $this->result=true;
  }

  


}
